package com.waitingresult.zuo.linked;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;

/**
 * @Author: WangShuai
 * @CreateTime: 2022-11-08  15:34
 * @Description:
 * @Version: 1.0
 */
@SuppressWarnings("ALL")
public class NodeDemo {
    @Data
    @AllArgsConstructor
    @ToString
    public static class Node {
        private Integer value;
        private Node next;
    }

    @Data
    @AllArgsConstructor
    @ToString
    public static class DoubleNode {
        private Integer value;
        private Node last;
        private Node next;
    }

    public static void main(String[] args) {
        //  单向链表翻转
        Node node = new Node(1, new Node(2, new Node(3, null)));
        traverseNode(node);
        // 如果不接收，就会导致 链表只有第一个数据。
        // node = reverseNode(node);
        reverseNode(node);
        traverseNode(node);
    }

    // 遍历node节点
    public static void traverseNode(Node node) {
        while (node != null) {
            System.out.print(node.value + " ");
            // 移动指针
            node = node.next;
        }
        System.out.println();
    }
    // 翻转指针
    public static Node reverseNode(Node head) {
        // 链表的上一个节点
        Node pre = null;
        // 链表的下一个节点
        Node next = null;
        // 只要node 不为空就一直循环
        while (head != null) {
            // 得到当前节点的下一个节点
            next = head.next;
            // 把下一个节点指向空（第一次循环）、 第二+N次循环， 指向翻转前的下一个节点
            head.next = pre;
            // 把当前节点赋值给上一个节点
            pre = head;
            // 把下一个节点赋值给当前节点
            head = next;
        }
        return pre;

    }

    private static Node ranDomAddressNode(Node node) {

        while (node != null) {
            System.err.println(node.value);
            node = node.next;
//            Node temp = node;
//            Node next = node.getNext();

        }
        return node;
    }
}
